package com.cskaoyan.javase.exception._3myexception;

/**
 * @description: 自定义异常
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 学习自定义异常,只需要弄明白两点:
 *      1.如何自定义异常?
 *          a.写一个类让它继承RuntimeException,得到一个运行时异常
 *          b.写一个类让它继承Exception,得到了一个编译时异常
 *          类定义完了之后,直接在类中新增两个构造方法,无参的和String参数的,然后直接调用父类对应的构造方法即可
 *          于是自定义异常就完成了!
 *
 *      2:为什么要自定义异常,自定义异常的作用?
 *          自定义的异常对象如果想要抛出,必须程序员手动使用throw关键字去抛出,否者不会抛出
 *          自定义异常的抛出绝不会是jdk源码或者jvm抛出的,所以根据自定义异常的抛出和捕获处理可以更加精准的得到问题的位置和原因
 *
 * 大多数公司都有自身的异常体系,和工具类类似,都需要新人学习
 *
 */
public class Demo {
    public static void main(String[] args) {
        /*try {
            checkNumber(0);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("相应处理");
        }
        System.out.println("after");*/

        try {
            checkNumberChecked(10);
        } catch (NumberCheckedException e) {
            e.printStackTrace();
            System.out.println("相应处理");
        }
        System.out.println("after");
    }

    public static void checkNumber(int num) {
        if (num > 1) throw new NumberRuntimeException("对象太多了,海王");
        if (num < 0) throw new NumberRuntimeException("怎么会少于0呢?");
        System.out.println("很好,很正常!");
    }
    public static void checkNumberChecked(int num) throws NumberCheckedException {
        if (num > 1) throw new NumberCheckedException("对象太多了,海王");
        if (num < 0) throw new NumberCheckedException("怎么会少于0呢?");
        System.out.println("很好,很正常!");
    }
}

//自定义编译时异常
class NumberCheckedException extends Exception {
    public NumberCheckedException() {
        super();
    }

    public NumberCheckedException(String message) {
        super(message);
    }
}

//自定义运行时异常
class NumberRuntimeException extends RuntimeException {
    public NumberRuntimeException() {
        super();
    }

    public NumberRuntimeException(String message) {
        super(message);
    }
}